home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / FILENAME.D < prev    next >
Encoding:
Modula Definition  |  1990-07-04  |  9.8 KB  |  226 lines

  1. DEFINITION MODULE FileNames;
  2.  
  3. (*
  4.  * ---------------------------------------------------------------
  5.  *   Operationen auf Datei- und Ordnernamen (ohne Disk-Zugriffe)
  6.  *      sowie Hinweise zur Benutzung des GEM-File-Selektors.
  7.  * ---------------------------------------------------------------
  8.  *
  9.  * Namensverwendung und allg. Erklärungen:
  10.  *
  11.  * - Directories sind Verzeichnisse (Ordner) und werden auch mit "Dir"
  12.  *   abgekürzt;
  13.  *
  14.  * - Das Hauptverzeichnis (Wurzel-) (z.B. "A:\") wird auch "Root"-Dir genannt;
  15.  *
  16.  * - Pfade (engl. "Path) sind "Wegbeschreibungen" zu bestimmten Ordnern und
  17.  *   enthalten eine optionale Laufwerksangabe ("A:") sowie beliebige Ordner-
  18.  *   namen. Beispiel: "A:\AUTO\";
  19.  *
  20.  * - Ordner in einem Pfadnamen sollten immer mit einem Backslash ("\")
  21.  *   abgeschlossen sein (siehe auch Funktion 'ValidatePath');
  22.  *
  23.  * - Suffices (Suffix) sind die Namensendungen (Extensionen), z.B. "PRG"
  24.  *   und werden in der Regel als 3-Zeichen-Strings ohne den Punkt angegeben.
  25.  *   Im Gegensatz zum "Suffix" wird der Namensteil vor dem Punkt auch als
  26.  *   "Prefix" bezeichnet;
  27.  *
  28.  * - Als Dateinamen sind, je nach Anwendung, entweder die Namen selbst in einem
  29.  *   Ordner (oder Root-Dir) (z.B. "EDITOR.PRG") oder auch mitsamt ihrem Pfad
  30.  *   (z.B. "A:\MODULA\EDITOR.PRG") gemeint;
  31.  *
  32.  * - Das Default- (aktuelle) Laufwerk ist das, welches angesprochen wird,
  33.  *   wenn ein Pfadname keinen Laufwerkbuchstaben enthält (z.B. "\AUTO\");
  34.  *
  35.  * - Der Default- (aktuelle) Pfad/Dir ist derjenige, der angesprochen wird,
  36.  *   wenn ein Pfad keinen Pfadnamen enthält (sondern höchstens eine Lauf-
  37.  *   werksbezeichnung). Es gibt für jedes Laufwerk einen eigenen Default-Pfad.
  38.  *   Teilweise wird auch zw. Default-Dir und Default-Pfad unterschieden. Dann
  39.  *   ist mit Default-Dir der aktuelle Pfad auf einem bestimmten Laufwerk
  40.  *   gemeint, mit Default-Pfad der aktuelle Pfad des aktuellen Laufwerks;
  41.  *
  42.  * - Wildcard (auch beliebt als "wildcats") sind Dateinamen mit Jokern.
  43.  *   Joker sind "*" und "?". Joker dürfen nicht im Pfad-Teil eines Dateinamens
  44.  *   vorkommen (also nicht in Ordnernamen). Ist ein "*" vorhanden, wird es
  45.  *   intern zuerst durch "?" ersetzt, und zwar vom ersten "*" an bis zum
  46.  *   Ende des Prefix/Suffix (beide werden getrennt behandelt). Dann steht
  47.  *   jedes "?" für einen beliebiges Zeichen (oder auch keins). Bleiben
  48.  *   Leerzeichen, haben diese keine Joker-Funktion - an ihrer Stelle dürfen
  49.  *   nur Leerzeichen oder gar keine vorkommen.
  50.  *   Wildcards werden z.B. in 'DirQuery' (Listen von Dateien in einem Ordner)
  51.  *   oder 'NameMatching' verwendet. Letztere Funktion enthält auch Beispiele
  52.  *   für Wildcards;
  53.  *)
  54.  
  55. FROM MOSGlobals IMPORT FileStr, PathStr, DriveStr, NameStr, PfxStr, SfxStr,
  56.                        Drive, DriveSet;
  57.  
  58.  
  59. PROCEDURE ValidatePath ( VAR path: ARRAY OF CHAR );
  60. PROCEDURE PathValidated ( REF path: ARRAY OF CHAR ): PathStr;
  61.   (*
  62.    * Fügen ggf. '\' an den Pfadnamen an, damit 'path' eindeutig als vollst.
  63.    * Pfadname erkennbar ist. Zudem wird der Pfad ggf. in Großbuchstaben
  64.    * umgewandelt.
  65.    *
  66.    * Ein '\' wird genau dann angefügt, wenn der Pfad weder leer, noch das
  67.    * letzte Zeichen ein ':' oder schon ein '\' ist.
  68.    *
  69.    * Bei 'ValidatePath' ist darauf zu achten, daß der String groß genug
  70.    * ist (mind. 128 Zeichen, z.B. vom Type 'PathStr'), sonst tritt ggf.
  71.    * ein "String overflow"-Fehler auf!
  72.    *
  73.    * Diese Funktion sollte nach allen Pfadeingaben von außen angewandt
  74.    * werden! (Die hiesigen Funktionen, die Pfade liefern, tun dies selbst).
  75.    *
  76.    * Beispiele:
  77.    *   PathValidated ("A:")          = "A:"         (akt. Pfad auf A:)
  78.    *   PathValidated ("A:ORDNER")    = "A:ORDNER\"
  79.    *   PathValidated ("ORDNER")      = "ORDNER\"
  80.    *   PathValidated ("")            = ""           (Default-Pfad)
  81.    *   PathValidated ("\")           = "\"
  82.    *)
  83.  
  84. PROCEDURE SplitPath ( REF fullname: ARRAY OF CHAR;
  85.                       VAR path, name: ARRAY OF CHAR );
  86.   (*
  87.    * Spaltet einen vollst. Dateinamen in seinen Pfad und den "einfachen"
  88.    * Dateinamen (ohne Pfad) auf.
  89.    * 'name' sollte mind. 12 Zeichen fassen, 'path' sollte so groß wie
  90.    * 'name' (oder mind. 128 Zeichen) sein, sonst kann ein Laufzeitfehler
  91.    * (string overflow) auftreten.
  92.    *)
  93.  
  94. PROCEDURE SplitName ( REF filename: ARRAY OF CHAR;
  95.                       VAR prfx, sfx: ARRAY OF CHAR );
  96.   (*
  97.    * Spaltet einen "einfachen" Dateinamen (12 Zeichen, ohne Pfad) in Prefix
  98.    * (8 Zeichen) und Suffix (3 Zeichen) auf.
  99.    *)
  100.  
  101. PROCEDURE FileName   ( REF filename: ARRAY OF CHAR ): NameStr;
  102. PROCEDURE FilePath   ( REF filename: ARRAY OF CHAR ): PathStr;
  103. PROCEDURE FilePrefix ( REF filename: ARRAY OF CHAR ): PfxStr;
  104. PROCEDURE FileSuffix ( REF filename: ARRAY OF CHAR ): SfxStr;
  105.   (*
  106.    * Liefern den Datei-Namen (Prefix & Suffix), den Pfad, den Prefix und
  107.    * die Extension eines beliebigen Dateinamens.
  108.    * Zur Ermittelung der Laufwerkskennung kann die Funktion 'StrToDrive'
  109.    * verwendet werden.
  110.    *)
  111.  
  112. PROCEDURE ConcatName ( REF prefix, suffix: ARRAY OF CHAR;
  113.                        VAR name: ARRAY OF CHAR);
  114. PROCEDURE NameConc ( REF prefix, suffix: ARRAY OF CHAR ): FileStr;
  115.   (*
  116.    * Setzt einen Dateinamen aus Prefix und Suffix zusammen.
  117.    *
  118.    * Sowohl 'prefix' als auch 'suffix' dürfen den jeweils anderen Namensteil
  119.    * enthalten (oder auch nur den Punkt) - sie werden ignoriert.
  120.    * 'prefix' darf auch einen Pfadnamen voranstehen haben.
  121.    * Ist 'suffix' leer, wird kein Punkt angefügt.
  122.    *
  123.    * Beispiel: NameConc ( 'd:\venus', 'mup' )   = 'd:\venus.mup'
  124.    *           NameConc ( 'a:\b\c.txt', 'doc' ) = 'a:\b\c.doc'
  125.    *           NameConc ( 'bla.txt', 'xx.doc' ) = 'bla.doc'
  126.    *           NameConc ( 'bla.txt', '' )       = 'bla'
  127.    *           NameConc ( 'bla.txt', 'nix.' )   = 'bla.'
  128.    *)
  129.  
  130. PROCEDURE ConcatPath ( REF path, name: ARRAY OF CHAR;
  131.                        VAR fullname: ARRAY OF CHAR);
  132. PROCEDURE PathConc ( REF path, name: ARRAY OF CHAR ): FileStr;
  133.   (*
  134.    * Setzt einen vollständigen Dateinamen aus Pfad und Namen zusammen.
  135.    *
  136.    * Sowohl 'path' als auch 'name' dürfen den jeweils anderen Namensteil
  137.    * enthalten - sie werden ignoriert. Allerdings muß 'path', wenn
  138.    * nur ein Pfadname enthalten ist, ggf. mithilfe von 'ValidatePath' mit
  139.    * einem '\' abgeschlossen sein, weil sonst der letzte Ordnername im
  140.    * Pfad als Dateiname erkannt werden und abgeschnitten würde.
  141.    *
  142.    * Beispiel: PathConc ( 'A:XXX.DAT', 'C:\MEIN.PA' ) = 'A:MEIN.PA'
  143.    *           PathConc ( 'A:\DA\', 'C:\MEIN.PA' ) = 'A:\DA\MEIN.PA'
  144.    *)
  145.  
  146.  
  147. PROCEDURE NameUnique ( REF fileName: ARRAY OF CHAR ): BOOLEAN;
  148.   (*
  149.    * Liefert FALSE, wenn Wildcards ('?' oder '*') im Namen enthalten sind.
  150.    * Liefert auch TRUE, wenn 'fileName' leer ist!
  151.    *)
  152.  
  153. PROCEDURE NameMatching ( REF fileName, wildcard: ARRAY OF CHAR ): BOOLEAN;
  154.   (*
  155.    * Übergeben werden ein Dateiname in 'fileName' und ein Wildcard-Name
  156.    * in 'wildcard'.
  157.    * Es wird TRUE geliefert, wenn der Dateiname zum dem Wildcard paßt.
  158.    * Ist 'fileName' leer, wird immer FALSE geliefert.
  159.    * Es dürfen keine Pfade in den Namen enthalten sein, sonst kann es
  160.    * zu fehlerhaften Ergebnissen kommen!
  161.    *
  162.    * Solch eine Prüfung wird auch beim 'wildcard'-Parameter bei 'DirQuery'
  163.    * vorgenommen.
  164.    *
  165.    * Beispiele:
  166.    *   auf Wildcard | passen folg. Dateinamen | passen folg. Dateinamen nicht
  167.    *   ------------ | ----------------------- | -----------------------------
  168.    *    "*.*"       |  Alle                   |  ""
  169.    *    "ABC.*"     |  "ABC.A", "ABC"         |  "ABCD.A", "B.DEF"
  170.    *    "A?"        |  "A", "AB"              |  "ABC", "A.B" (kein Suffix!)
  171.    *    "?B*.?"     |  "AB", "AB.D", "ABCD"   |  "AB.DEF", "AC.D"
  172.    *)
  173.  
  174. PROCEDURE DriveToStr ( driveNo: Drive ): DriveStr;
  175.   (*
  176.    * Liefert einen Leerstring, wenn 'driveNo' = 'defaultDrv', sonst
  177.    * den gewünschten LW-Buchstaben mit einem Doppelpunkt.
  178.    *
  179.    * Beispiel: 'DriveToStr ( drvB )' = "B:"
  180.    *)
  181.  
  182. PROCEDURE StrToDrive ( REF driveStr: ARRAY OF CHAR ): Drive;
  183.   (*
  184.    * Liefert die Laufwerkskennung eines beliebigen Datei- ode Pfadnamens.
  185.    * Liefert immer 'defaultDrv', wenn kein Laufwerk (muß ':' enthalten!)
  186.    * oder ein ungültiges Laufwerk angegeben ist.
  187.    *
  188.    * Beipiel: 'StrToDrive ("")' = 'defaultDrv'
  189.    *          'StrToDrive ("C")' = 'defaultDrv' (* ':' fehlt! *)
  190.    *          'StrToDrive ("C:")' = 'drvC'
  191.    *          'StrToDrive ("C:SOURCES\TEST.M")' = 'drvC'
  192.    *          'StrToDrive ("SOURCES\TEST.M")' = 'defaultDrv'
  193.    *)
  194.  
  195. (*
  196.  * Anwendung des GEM-File-Selektors (FS)
  197.  * -------------------------------------
  198.  *
  199.  * Der FS erhält beim Aufruf zwei Strings. Der erste bestimmt den
  200.  * anzuzeigenden Ordner mit der Auswahlmaske (normalerweise '*.*').
  201.  * Der Andere gibt ggf. schon einen ausgewählten Dateinamen vor.
  202.  * Bei der Rückkehr erhält man ebensolche zusammengesetzten Strings
  203.  * wieder zurück.
  204.  *
  205.  * Beim ersten Aufruf des FS bietet es sich an, als Pfad den Aktuellen
  206.  * einzusetzen und als Maske '*.*' zu verwenden. Dies wird folgender-
  207.  * maßen erreicht:
  208.  *   ordnerUndMaske:= PathConc ( DefaultPath (), '*.*' );
  209.  * Der andere String für den Aufruf wird meist leer sein, nennen wir
  210.  * ihn 'name'.
  211.  *   GEMEnv.SelectFile ( ordnerUndMaske, name, ok );
  212.  * Bei der Rückkehr kann der dann gewählte Dateiname folgendenmaßen
  213.  * ermittelt werden:
  214.  *   dateiName:= PathConc ( ordnerUndMaske, name );
  215.  * Bei weiteren Aufrufen des FS ist es meist ratsam, dieselben Strings
  216.  * 'ordnerUndMaske' und 'name' (global deklarieren!) wieder anzugeben
  217.  * - so findet der Anwender immer seine Einstellungen vom vorigen Aufruf
  218.  * wieder.
  219.  *
  220.  * >>> Allerdings kann auch bequemer die Routine 'SelectFile' aus dem
  221.  *     Modul 'EasyGEM1' verwendet werden! Diese erledigt die gerade
  222.  *     gezeigte Namens-/Pfadauswertung automatisch.
  223.  *)
  224.  
  225. END FileNames.
  226.